package com.atguigu.jxc.service.impl;

import com.atguigu.jxc.annotation.LogToDb;
import com.atguigu.jxc.dao.GoodsTypeDao;
import com.atguigu.jxc.entity.GoodsType;
import com.atguigu.jxc.service.GoodsTypeService;
import com.atguigu.jxc.util.StringUtil;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

@Service
public class GoodsTypeServiceImpl implements GoodsTypeService {

    @Autowired
    private GoodsTypeDao goodsTypeDao;

    @Override
    @LogToDb
    public String listGoodsTypeToJsonString() {
        List<GoodsType> goodsTypeList = goodsTypeDao.selectGoodsTypeList();
        Map<Integer, List<GoodsType>> goodsTypeGroupByPidMap = goodsTypeList.stream().collect(Collectors.groupingBy(GoodsType::getPId));
        return toJsonArray(goodsTypeGroupByPidMap, -1).toString();
    }

    @Override
    @Transactional
    public boolean save(String goodsTypeName, Integer pId) {
        GoodsType goodsType = new GoodsType(goodsTypeName, 0, pId);
        goodsTypeDao.updateGoodsTypeStateById(pId, 1);
        goodsTypeDao.insertGoodsType(goodsType);
        return true;
    }

    @Override
    public boolean removeGoodsTypeById(Integer goodsTypeId) {
        GoodsType goodsType = goodsTypeDao.selectGoodsTypeById(goodsTypeId);
        goodsTypeDao.deleteGoodsTypeById(goodsTypeId);
        List<GoodsType> goodsTypeList = goodsTypeDao.selectGoodsTypeListByPid(goodsType.getPId());
        if (goodsTypeList != null && goodsTypeList.size() == 0) {
            goodsTypeDao.updateGoodsTypeStateById(goodsType.getPId(), 0);
        }
        return true;
    }

    public JsonArray toJsonArray(Map<Integer, List<GoodsType>> goodsTypeGroupByPidMap, Integer pId) {
        List<GoodsType> goodsTypeList = goodsTypeGroupByPidMap.get(pId);
        JsonArray jsonArray = new JsonArray();
        for (GoodsType goodsType : goodsTypeList) {
            JsonObject jsonObject = new JsonObject();
            jsonObject.addProperty("id", goodsType.getGoodsTypeId());
            jsonObject.addProperty("text", goodsType.getGoodsTypeName());
            jsonObject.addProperty("state", goodsType.getGoodsTypeState() == 1 ? "closed" : "open");
            jsonObject.addProperty("iconCls", "goods-type");
            JsonObject attributes = new JsonObject();
            attributes.addProperty("state", goodsType.getGoodsTypeState());
            jsonObject.add("attributes", attributes);
            List<GoodsType> childrenGoodsTypeList = goodsTypeGroupByPidMap.get(goodsType.getGoodsTypeId());
            if (null != childrenGoodsTypeList) {
                JsonArray children = toJsonArray(goodsTypeGroupByPidMap, goodsType.getGoodsTypeId());
                jsonObject.add("children", children);
            }
            jsonArray.add(jsonObject);
        }
        return jsonArray;
    }

}
